package com.yzh.luckydraw.domain.supports.ids.policy;

import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.net.NetUtil;
import cn.hutool.core.util.IdUtil;
import com.yzh.luckydraw.domain.supports.ids.IIdGenerator;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

/**
 * hutool工具包下的雪花算法
 */
@Component
public class SnowFlake implements IIdGenerator {
    private Snowflake snowFlake;

    @PostConstruct
    public void init() {
        //0~31位，可以采用配置的方式使用
        long workerId;
        try {
            //标识机器的唯一性，使用ipv4地址作为workerId的值。
            workerId = NetUtil.ipv4ToLong(NetUtil.getLocalhostStr());
        } catch (Exception e) {
            //获取失败则将本地主机名的哈希码作为workerId的值
            workerId = NetUtil.getLocalhostStr().hashCode();
        }
        /* 将workerId的二进制表示位右移动16位，再将结果与31计算
         * 这里是为了将workerId控制在0~31之间，也就是5个bit位。因为雪花算法只给workerId预留5个bit位置
         */
        workerId = workerId >> 16 & 31;

        long dataCenterId = 1L;
        snowFlake = IdUtil.createSnowflake(workerId, dataCenterId);
    }

    @Override
    public long nextId() {
        return snowFlake.nextId();
    }
}
